package com.example.leetcode.StackSimple;

import org.junit.Test;

import java.util.Stack;

public class A_棒球_Baseball_Game {
    /**
     * 你现在是棒球比赛记录员。
     * 给定一个字符串列表，每个字符串可以是以下四种类型之一：
     * 1.整数（一轮的得分）：直接表示您在本轮中获得的积分数。
     * 2. "+"（一轮的得分）：表示本轮获得的得分是前两轮有效 回合得分的总和。
     * 3. "D"（一轮的得分）：表示本轮获得的得分是前一轮有效 回合得分的两倍。
     * 4. "C"（一个操作，这不是一个回合的分数）：表示您获得的最后一个有效 回合的分数是无效的，应该被移除。
     *
     * 输入: ["5","-2","4","C","D","9","+","+"]
     * 输出: 27
     */
    public static void main(String[] args) {
        String[] ops=  {"5","2","C","D","+"};
        System.out.println(calPoints(ops));
    }
    //第一版
    public static int calPoints(String[] ops) {
        Stack<Integer> scores = new Stack<>();
        for (int i = 0; i < ops.length; i++) {
            if ("C".equals(ops[i])){
                if (!scores.empty()){
                    scores.pop();
                }
                continue;
            }
            if ("D".equals(ops[i])){
                if (!scores.empty()){
                    Integer pop = scores.pop();
                    Integer doubleScore = pop * 2;
                    scores.push(pop);
                    scores.push(doubleScore);

                }
                continue;
            }
            if ("+".equals(ops[i])){
                if (!scores.empty()){
                    Integer pop1 = scores.pop();
                    Integer pop2 = scores.pop();
                    Integer plusScore = pop2+ pop1;
                    scores.push(pop2);
                    scores.push(pop1);
                    scores.push(plusScore);
                }
                continue;
            }
            scores.push(Integer.parseInt(ops[i]));
        }
        int sum=0;
        for (int i = 0; i < scores.size(); ) {
            sum+=scores.pop();
        }
        return sum;
    }
    //第二版
    public static int calPoints2(String[] ops) {
        Stack<Integer> scores = new Stack<>();
        for (int i = 0; i < ops.length; i++) {
            if ("C".equals(ops[i])){
                    scores.pop();
            }else if ("D".equals(ops[i])){
                    Integer doubleScore = scores.peek() * 2;
                    scores.push(doubleScore);
            }else  if ("+".equals(ops[i])){
                    Integer pop1 = scores.pop();
                    Integer plusScore = scores.peek()+ pop1;
                    scores.push(pop1);
                    scores.push(plusScore);
            }else {
                scores.push(Integer.parseInt(ops[i]));

            }
        }
        Integer sum=0;
        for (Integer score : scores) {
            sum+=score;
        }
        return sum;
    }

}
